package com.boil.util;

import com.boil.qz.safekavass.shiro.realm.UserAuthRealm;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.realm.Realm;

import java.util.Iterator;
import java.util.Locale;

/**
 * Created by ChenYong on 2017-05-03.
 * <br>
 * Shiro 工具类。
 */
public final class ShiroUtils {
    /**
     * 对密码进行 MD5 加密。
     *
     * @param passwd 密码
     * @return 密码密文
     */
    public static String passwd2Md5(String passwd) {
        if (StringUtils.isBlank(passwd)) {
            return Constants.EMPTY_STR;
        }

        return new Md5Hash(passwd).toHex().toLowerCase(Locale.getDefault());
    }

    /**
     * 对密码进行 MD5 加密，利用密码的盐值迭代 10 次。
     *
     * @param passwd     密码
     * @param passwdSalt 密码的盐值
     * @return 密码密文
     */
    public static String passwd2Md5(String passwd, String passwdSalt) {
        if (StringUtils.isBlank(passwd) || StringUtils.isBlank(passwdSalt)) {
            return Constants.EMPTY_STR;
        }

        return new Md5Hash(passwd, passwdSalt, Constants.VALUE_10).toHex().toLowerCase(Locale.getDefault());
    }

    /**
     * 清空授权缓存。
     */
    public static synchronized void clearAuthorizationCache() {
        RealmSecurityManager realmSecurityManager = (RealmSecurityManager) SecurityUtils.getSecurityManager();
        Iterator<Realm> realmIterator = realmSecurityManager.getRealms().iterator();
        while (realmIterator.hasNext()) {
            UserAuthRealm userAuthRealm = (UserAuthRealm) realmIterator.next();

            // 清空授权缓存
            userAuthRealm.clearAuthorizationCache();
        }
    }
}